

/**
 * 恢复技能计算
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} target_unit 
 * @param {*} skill_name 
 * @returns 
 */
export function computing_regen_skill(fight_data, src_unit, target_unit, skill_name) {
    // console.debug(`恢复技能计算 => 编号: ${src_unit["编号"]} 类型: ${src_unit["类型"]} 气血: ${src_unit["气血"]} 目标编号: ${target_unit["编号"] ? target_unit["编号"] : "无"}  技能：${skill_name}`);
    let skill_level = G.FightUnitUtils.get_unit_skill_level(src_unit, skill_name);
    let skill_data = G.SkillData.default[skill_name];
    let target_count = 1;
    let target_list = [];

    if (skill_data["不可指定自己"] && src_unit["编号"] === target_unit["编号"]) {
        console.warn(`技能 ${skill_name} 不能对自己使用, 跳过技能算法`);
        return;
    }

    // 目标数量计算 从技能配置取
    if (skill_data["指定对象"] === "自己") {
        target_unit = src_unit;
    } else if (skill_data["指定目标"]) {
        target_list = skill_data["指定目标"](fight_data, src_unit, target_unit, target_count);
        target_count = target_list.length;
    } else if (skill_data["目标"]) {
        target_count = skill_data["目标"](fight_data, src_unit, skill_level);
        target_list = target_list = G.FightUtils.get_enemy_team_group_survive_unit(fight_data, src_unit, target_unit, target_count);
    } else {
        console.debug(`恢复类技能 ${skill_name} 未定义目标计算`);
    }

    if (target_count === 0) {
        console.debug(`恢复类技能 ${skill_name} 获取技能目标数为零，跳过计算 `);
        return;
    }

    if (target_list.length === 0) {
        console.debug(`恢复类技能 ${skill_name} 未找到目标，跳过计算 `);
        return;
    }

    // 取技能消耗
    let consummer_value = 0;
    let consummer_type = "";
    if (skill_data && skill_data["消耗"]) {
        let res = skill_data["消耗"](fight_data, src_unit, 1);
        if (res) {
            consummer_value = res[0];
            consummer_type = res[1];
        }
    }
    // 如果需要的消耗类型不够则行动失败
    if (!G.FightUnitUtils.excute_unit_skill_consummer(fight_data, src_unit, consummer_type, consummer_value, skill_name)) {
        fight_data["战斗流程"].push({ "流程": 6, "战斗提示": { "内容": "行动失败", "编号": src_unit["编号"] } });
        return;
    }

    // 执行技能算法
    if (skill_data["恢复算法"]) {

        fight_data["战斗流程"].push({ "流程": 60, "攻击方": src_unit["编号"], "被攻击": [], "提示": { "允许": true, "类型": "法术", "名称": `${src_unit["名称"]}使用了${skill_name}` }, "技能提示": { "内容": `【恢复】${skill_name}`, "编号": src_unit["编号"] } });
        G.FightUtils.add_waiting_play_time(fight_data, 2, "恢复技能");

        if (ex_skill[skill_name]) {
            fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["特技名称"] = skill_name;
        }

        // 所有被选中单位超级永恒状态计算
        for (let index = 0; index < target_list.length; index++) {
            let target = target_list[index];
            if (target["法术状态"]["超级永恒"]) {
                let hh = 0;
                if (target["法术状态"]["超级永恒"]["可增回合"] > 0) {
                    //增加100%持续回合数
                    hh = target["法术状态"]["超级永恒"]["回合"] * 2;
                    if (hh > target["法术状态"]["超级永恒"]["可增回合"]) {
                        hh = target["法术状态"]["超级永恒"]["可增回合"];
                    }
                }
                target["法术状态"]["超级永恒"]["可增回合"] = hh;
            }
        }
        //所有目标单位的技能演算
        for (let index = 0; index < target_list.length; index++) {
            let target = target_list[index];
            fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][index] = { "编号": target_unit["编号"], "特效": [skill_name] };
            skill_data["恢复算法"](fight_data, src_unit, target, skill_level, target_list, index);
        }
        // 恢复时触发
        if (G.FightUnitUtils.check_unit_shen_qi_skill(src_unit, "风起云墨") && target_list[0]) {
            target_list[0]["特殊状态"]["风起云墨"] = true;
            target_list[0]["特殊状态"]["风起云墨"]["生效回合"] = fight_data["回合"];
        }
    } else {
        console.warn(`恢复类技能 ${skill_name} 未定义算法，跳过计算 `);
    }
}


